package de.h_da.fbi.cg.pointcloud.spatial;

/**
 * @author Nicolas Gramlich
 * @since 19:28:43 - 11.11.2010
 * @param <Coord>
 * @param <P>
 */
public class EuclideanDistance<C extends Number & Comparable<C>, P extends IPoint<C>> implements IDistanceAlgorithm<C, P> {
	// ===========================================================
	// Constants
	// ===========================================================

	// ===========================================================
	// Fields
	// ===========================================================

	// ===========================================================
	// Constructors
	// ===========================================================

	// ===========================================================
	// Getter & Setter
	// ===========================================================

	// ===========================================================
	// Methods for/from SuperClass/Interfaces
	// ===========================================================

	@Override
	public double distance(final P pFrom, final P pTo) {
		return Math.sqrt(this.distanceSquared(pFrom, pTo));
	}

	@Override
	public double distanceSquared(final P pFrom, final P pTo) {
		double d = 0;
		final int imax = pFrom.getDimensions();

		for(int i = 0; i < imax; ++i) {
			final double diff = (pTo.getCoordinate(i).doubleValue() - pFrom.getCoordinate(i).doubleValue());
			d += (diff * diff);
		}

		return d;
	}

	// ===========================================================
	// Methods
	// ===========================================================

	// ===========================================================
	// Inner and Anonymous Classes
	// ===========================================================
}
